package com.kh.rationaldrugreview.dto;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

import java.util.List;
import java.util.Map;

/**
 * 患者上下文
 * Patient Context for Risk Assessment
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PatientContext {
    
    /**
     * 基本信息
     */
    private Long patientId;
    private String patientCode;
    private String name;
    
    /**
     * 生理特征
     */
    private String gender;           // 性别：男/女
    private Integer age;             // 年龄
    private String ageGroup;         // 年龄组：新生儿/婴儿/幼儿/儿童/青少年/成人/老年人
    private Double weight;           // 体重 (kg)
    private Double height;           // 身高 (cm)
    private Double bmi;              // BMI
    private Double bsa;              // 体表面积 (m²)
    
    /**
     * 妊娠哺乳状态
     */
    private Boolean isPregnant;      // 是否怀孕
    private String pregnancyStatus;  // 妊娠状态：未怀孕/孕早期/孕中期/孕晚期
    private Integer gestationalWeek; // 孕周
    private Boolean isLactating;     // 是否哺乳
    private String lactationStatus;  // 哺乳状态：非哺乳期/哺乳期
    
    /**
     * 器官功能状态
     */
    private String renalFunction;    // 肾功能：正常/轻度不全/中度不全/重度不全/透析
    private Double creatinineClearance; // 肌酐清除率 (ml/min)
    private Double serumCreatinine;  // 血肌酐 (mg/dL)
    
    private String hepaticFunction;  // 肝功能：正常/轻度不全/中度不全/重度不全
    private String childPughClass;   // Child-Pugh分级：A/B/C
    private Double alt;              // 丙氨酸氨基转移酶
    private Double ast;              // 天冬氨酸氨基转移酶
    private Double totalBilirubin;   // 总胆红素
    
    /**
     * 疾病史和过敏史
     */
    private List<String> medicalHistory;    // 病史
    private List<String> allergies;         // 过敏史
    private List<String> currentDiagnoses;  // 当前诊断
    private List<String> chronicConditions; // 慢性疾病
    
    /**
     * 生活方式
     */
    private String smokingStatus;    // 吸烟状态：不吸烟/现在吸烟/既往吸烟
    private String drinkingStatus;   // 饮酒状态：不饮酒/偶尔饮酒/经常饮酒
    private String dietaryRestrictions; // 饮食限制
    
    /**
     * 遗传因子信息
     */
    private Map<String, String> geneticProfile; // 基因型信息 (CYP2D6, CYP3A4等)
    
    /**
     * 实验室指标
     */
    private Map<String, Double> laboratoryValues; // 实验室检查值
    
    /**
     * 既往用药史
     */
    private List<String> previousMedications;     // 既往用药
    private List<String> currentMedications;      // 当前用药
    private List<String> adverseDrugReactions;    // 既往药物不良反应
    
    /**
     * 特殊状态标记
     */
    private Boolean isICUPatient;     // 是否ICU患者
    private Boolean isImmunocompromised; // 是否免疫功能低下
    private Boolean hasHeartDisease;     // 是否有心脏疾病
    private Boolean hasDiabetes;         // 是否有糖尿病
    private Boolean hasHypertension;     // 是否有高血压
    
    /**
     * 临床环境
     */
    private String department;        // 科室
    private String wardType;         // 病房类型
    private String careLevel;        // 护理级别
    
    /**
     * 计算BMI
     */
    public void calculateBMI() {
        if (weight != null && height != null && height > 0) {
            double heightInMeters = height / 100.0;
            this.bmi = weight / (heightInMeters * heightInMeters);
        }
    }
    
    /**
     * 计算体表面积 (Mosteller公式)
     */
    public void calculateBSA() {
        if (weight != null && height != null) {
            this.bsa = Math.sqrt((height * weight) / 3600.0);
        }
    }
    
    /**
     * 判断是否为儿童患者
     */
    public boolean isPediatric() {
        return age != null && age < 18;
    }
    
    /**
     * 判断是否为老年患者
     */
    public boolean isGeriatric() {
        return age != null && age >= 65;
    }
    
    /**
     * 判断是否有肾功能不全
     */
    public boolean hasRenalImpairment() {
        return renalFunction != null && 
               (renalFunction.contains("不全") || renalFunction.contains("透析"));
    }
    
    /**
     * 判断是否有肝功能不全
     */
    public boolean hasHepaticImpairment() {
        return hepaticFunction != null && hepaticFunction.contains("不全");
    }
    
    /**
     * 获取风险相关的患者特征摘要
     */
    public String getRiskProfileSummary() {
        StringBuilder summary = new StringBuilder();
        
        if (isPregnant != null && isPregnant) {
            summary.append("孕妇(").append(pregnancyStatus).append(") ");
        }
        
        if (isLactating != null && isLactating) {
            summary.append("哺乳期 ");
        }
        
        if (isPediatric()) {
            summary.append("儿童 ");
        } else if (isGeriatric()) {
            summary.append("老年 ");
        }
        
        if (hasRenalImpairment()) {
            summary.append("肾功能不全 ");
        }
        
        if (hasHepaticImpairment()) {
            summary.append("肝功能不全 ");
        }
        
        if (allergies != null && !allergies.isEmpty()) {
            summary.append("药物过敏史 ");
        }
        
        return summary.toString().trim();
    }
}